package com.gitee.cnlongdb.server.transaction;

import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.commons.collections.CollectionUtils;

import com.gitee.cnlongdb.basic.constant.ConcurrentDataMap;
import com.gitee.cnlongdb.basic.constant.LongDbConstant;
import com.gitee.cnlongdb.basic.entity.insert.InsertDataEntity;
import com.gitee.cnlongdb.basic.entity.update.UpdateDateEntity;
import com.gitee.cnlongdb.basic.utils.RandomUtil;
import com.gitee.cnlongdb.server.connect.LongDbConnect;

/**
 * 系统名称：LongdbTransactionManager
 * 模块名称：
 × 模块描述：longdb - 事务管理器
 × 功能列表：
 × 模块作者：ZOUYONG
 × 开发时间：2018年12月7日 下午1:44:42
 × 模块路径：com.gitee.cnlongdb.server.transaction.LongdbTransactionManager
 */
public class LongdbTransactionManager {
	
	private static LongDbConnect connect;

	/**
	 * 功能描述：开启事务
	 × 模块作者：ZOUYONG
	 × 开发时间：2018年12月7日 下午1:45:55
	 × 返回数据：String
	 */
	public static String startTransaction(boolean isTranscationFlag) {
		String transactionName = RandomUtil.getRandomNumber(24);
		if(isTranscationFlag) {
			transactionName += LongDbConstant.longdbTranscationFlag;
		}
		Thread.currentThread().setName(transactionName);
		return transactionName;
	}
	
	/**
	 * 功能描述：提交事务
	 × 模块作者：ZOUYONG
	 × 开发时间：2018年12月7日 下午1:49:03
	 × 返回数据：void
	 * @throws Exception 
	 */
	public static void commitTransaction(String transactionName) throws Exception {
		// 处理新增数据的事务
		ConcurrentHashMap<String, InsertDataEntity> inserDataMap = ConcurrentDataMap.tempInsertDataMap.get(transactionName);
		try {
			if(null != inserDataMap && inserDataMap.size() > 0) {
				connect.getInsertOperator().batchInsertDataWriteTable(inserDataMap);
			}
		} catch(Exception e) {
			ConcurrentDataMap.tempInsertDataMap.remove(transactionName);
			throw e;
		}
		// 处理要修改或删除数据的事务
		List<UpdateDateEntity> updDelDataList = ConcurrentDataMap.tempUpdDelDataMap.get(transactionName);
		try {
			if(CollectionUtils.isNotEmpty(updDelDataList)) {
				for (UpdateDateEntity updDelData : updDelDataList) {
					connect.getRemoveOperator().updateTableFileLineData(updDelData);
				}
			}
		} catch(Exception e) {
			ConcurrentDataMap.tempUpdDelDataMap.remove(transactionName);
			throw e;
		}
	}
	
	/**
	 * 功能描述：回滚事务
	 × 模块作者：ZOUYONG
	 × 开发时间：2018年12月7日 下午1:49:27
	 × 返回数据：void
	 */
	public static void rollbackTransaction(String transactionName) {
		ConcurrentDataMap.tempInsertDataMap.remove(transactionName);
		ConcurrentDataMap.tempUpdDelDataMap.remove(transactionName);
	}

	public static void setConnect(LongDbConnect connect) {
		LongdbTransactionManager.connect = connect;
	}

}
